#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
std::mutex mtx;
void foo(int &num)
{
    //  lock_guard管理锁
    // 1、自动加锁	构造时自动对传入的互斥锁加锁。
    // 2、自动解锁	析构时自动解锁，即使函数提前返回或抛出异常也能保证解锁。
    // 3、异常安全	利用 RAII 技术，确保锁在异常情况下也能正确释放。
    // 4、不支持手动解锁	一旦加锁，必须等到作用域结束才能解锁，无法中途手动解锁。
    std::lock_guard<mutex> lock{mtx};
    num++;
}
int main()
{
    int num{1};
    thread t1(foo, ref(num));
    thread t2(foo, ref(num));
    t1.join();
    t2.join();
    cout << "num is " << num << endl;
    return 0;
}